package com.gdlgxy.oa.DAO;

import com.gdlgxy.oa.bean.Fare;
import com.gdlgxy.oa.bean.FareList;
import com.gdlgxy.oa.service.FareServer;
import com.gdlgxy.oa.utils.DBUtil;

import java.sql.*;
import java.util.Date;

/**
 * 通过数据库获取对应学生的支出记录
 *
 * @return 学生链表
 */
public class FareListDao implements Dao{
    /**
     * 通过数据库获取学生对应的支出
     *
     * @return 学生链表
     */
    public static FareList getFareList(int Sno) {
        // 创建学生对应的支出列表
        // 传入当前的支出类型
        FareList list = new FareList(Sno, KindListDao.getKindList());

        // 连接数据库，查询当前的学生的支出
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "SELECT Fno,Kno,Fmoney,Ftime,Fremark FROM t_fare WHERE Sno=" + Sno;
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                int Fno = rs.getInt("Fno");
                int Kno = rs.getInt("Kno");
                Double money = rs.getDouble("Fmoney");
                Date date = rs.getTimestamp("Ftime");
                String remark = rs.getString("Fremark");
                // 添加支出
                list.fareAdd(new Fare(Fno, Kno, money, date, remark));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        System.out.println("DAO:获取学生的支出链表成功");

        return list;
    }

    /**
     * 将删除的支出节点同步到数据库中
     *
     * @param list 删除了一个节点后的支出链表
     * @return true删除成功，false删除失败
     */
    public static boolean delFareList(FareList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断删除学生是否成功,获取条数
        int count = 0;

        // 获取当前支出的链表中删除的节点
        int no = list.findFaretDel(FareServer.list(list.getSno()));
        System.out.println("DAO:开始删除支出节点，删除的支出节点为" + no);
        // 出现错误，保证改变的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 获取数据库操作对象
                Statement stmt = conn.createStatement();
                // 删除支出记录
                SQL = "DELETE FROM t_fare WHERE Fno=" + no;
                // 判断删除学生是否成功
                count = stmt.executeUpdate(SQL);
                System.out.println("DAO:删除的支出记录的条数为" + count);
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:删除支出节点完成，删除的条数为" + count);
            return true;
        }
        return false;
    }

    /**
     * 将添加的支出节点同步到数据库中
     *
     * @param list 添加了一个节点后的支出链表
     * @return true添加成功，false添加失败
     */
    public static boolean CreateFareList(FareList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断添加学生是否成功,获取条数
        int count = 0;

        // 获取当前支出的链表中最后的一个节点
        Fare temp = list.fareLast();
        System.out.println("DAO:开始添加支出节点，添加的支出节点的学生为" + list.getSno());
        System.out.println("DAO:开始添加支出节点，添加的支出节点的编号为" + temp.getFno());
        // 出现错误，保证关闭的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 添加学生
                String sql = "INSERT INTO t_fare(Sno, Kno, Fmoney, Ftime, Fremark) VALUES(?,?,?,?,?)";
                // 获取数据库预操作对象
                PreparedStatement stat = conn.prepareStatement(sql);
                stat.setInt(1, list.getSno());
                stat.setInt(2, temp.getKno());
                stat.setDouble(3, temp.getMoney());
                stat.setObject(4, temp.getSQLDate());
                stat.setString(5, temp.getRemark());
                // 判断添加支出是否成功
                count = stat.executeUpdate();
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:添加支出节点完成，添加的学生的条数为" + count);
            System.out.println();
            return true;
        }
        return false;
    }

    /**
     * 将修改的支出节点同步到数据库中
     *
     * @param list 修改了一个节点后的支出链表
     * @return true修改成功，false修改失败
     */
    public static boolean UpdateFareList(FareList list) {
        // 连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String SQL;
        // 判断删除学生是否成功,获取条数
        int count = 0;
        // 获取当前学生的链表中修改的节点
        Fare temp = list.findFareUpdate(FareServer.list(list.getSno()));

        System.out.println("DAO:开始修改支出节点，修改的支出节点的学生为" + list.getSno());
        System.out.println("DAO:开始修改支出节点，修改的支出节点为" + temp.getFno());
        // 出现错误，保证关闭的try
        try {
            conn = DBUtil.getConnection();
            // 事务的try
            try {
                conn.setAutoCommit(false);
                // 修改支出
                String sql = "UPDATE t_fare SET Kno = ?, Fmoney = ?, Ftime = ?, Fremark = ? WHERE Fno = ?";
                // 获取数据库预操作对象
                PreparedStatement stat = conn.prepareStatement(sql);
                stat.setInt(1, temp.getKno());
                stat.setDouble(2, temp.getMoney());
                stat.setObject(3, temp.getSQLDate());
                stat.setString(4, temp.getRemark());
                stat.setInt(5, temp.getFno());
                // 判断修改支出是否成功
                count = stat.executeUpdate();
                // 提交事务
                conn.commit();
            } catch (SQLException se) {
                // 失败就回滚事务
                System.out.println(se.getMessage());
                System.out.println("DAO:出现错误，开始回滚事务！！！");
                conn.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DBUtil.close(conn, ps, rs);
        }
        if (count > 0) {
            System.out.println("DAO:修改支出节点完成，修改的学生的条数为" + count);
            System.out.println();
            return true;
        }
        return false;
    }
}
